/**
 * 给两类操作A和B，选Ai则下次攻击乘Ai，选Bi则下次攻击为Bi
 * 怪物有X点血，问杀死怪物最少几次操作。不能输出-1
 * 由于倍乘操作只有一次的效果，所以肯定不会连续选Ai，且第一次必须选Bi
 * 其次，显然优先选大的，且Ai和Bi也是大大联合为佳
 * 最后，如果连续两次B操作能够完成任务，则一A一B操作必然也能。
 * 将A和B从大到小排序，且将A中的1全部删除
 * 每一次循环：
 *     首先看当前Bi能否杀死，能杀死就结束
 *     然后看Ai*Bi能否杀死，能杀死就结束
 *     否则按Ai和Bi操作
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using vi = vector<int>;

int N, M, X;
vi A, B;

int proc(){
    sort(A.begin(), A.end(), greater<int>());
    sort(B.begin(), B.end(), greater<int>());
    auto pos = find(A.begin(), A.end(), 1);
    if(pos != A.end()) A.erase(pos, A.end());
    N = A.size();

    int cnt = 0;
    int ai = 0, bi = 0;
    while(bi < M){
        if(B[bi] >= X) return cnt + 1;
        if(ai < N){
            X -= B[bi++] * A[ai++];
            if(X <= 0) return cnt + 2;
            cnt += 2;
        }else{
            X -= B[bi++];
            cnt += 1;
        }
    }
    return -1;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> N >> M >> X;
        A.assign(N, 0); B.assign(M, 0);
        for(auto & i : A) cin >> i;
        for(auto & i : B) cin >> i;
        cout << proc() << endl;
    }
    return 0;
}